import axios from 'axios'
import { Message, Loading } from 'element-ui'
import _ from 'lodash'

// 请求超时
axios.defaults.timeout = 10000
// 接口地址
axios.defaults.baseURL = process.env.VUE_APP_BASE_API

// loading对象
let loading

// 当前正在请求的数量
let showLoadingCount = 0

// 显示loading
function showLoading (target) {
  // 后面这个判断很重要，因为关闭时加了抖动，此时loading对象可能还存在，但showLoadingCount已经变成0.避免这种情况下会重新创建个loading
  if (showLoadingCount === 0 && !loading) {
    loading = Loading.service()
  }
  showLoadingCount++
}

// 隐藏loading
function hideLoading () {
  showLoadingCount--
  showLoadingCount = Math.max(showLoadingCount, 0) // 做个保护
  if (showLoadingCount === 0) {
    // 关闭loading
    toHideLoading()
  }
}

// 防抖：将 300ms 间隔内的关闭 loading 便合并为一次。防止连续请求时， loading闪烁的问题。
var toHideLoading = _.debounce(() => {
  loading.close()
  loading = null
}, 300)

// http request 拦截器
axios.interceptors.request.use(
  config => {
    console.log(config)
    if (config.loading !== false) {
      showLoading(config.headers.loadingTarget)
    }
    // token验证
    const token = sessionStorage.getItem('token')
    token && (config.headers.token = token)
    return config
  },
  error => {
    // 判断当前请求是否设置了不显示Loading
    if (error.loading !== false) {
      hideLoading()
    }
    return Promise.reject(error)
  }
)

// 响应拦截器即异常处理
axios.interceptors.response.use(
  response => {
    // 判断当前请求是否设置了不显示Loading
    if (response.config.loading !== false) {
      hideLoading()
    }
    // 和后台协商的code
    if (response.data.code !== 0) {
      Message.error(response.data.message)
    }
    return response
  }, error => {
    if (error && error.response) {
      // 判断当前请求是否设置了不显示Loading
      if (error.config.loading !== false) {
        hideLoading()
      }
      switch (error.response.status) {
        case 400:
          Message('错误请求')
          break
        case 401:
          Message('未授权，请重新登录')
          break
        case 403:
          Message('拒绝访问')
          break
        case 404:
          Message('请求错误,未找到该资源')
          break
        case 405:
          Message('请求方法未允许')
          break
        case 408:
          Message('请求超时')
          break
        case 500:
          Message('服务器繁忙')
          break
        case 501:
          Message('网络未实现')
          break
        case 502:
          Message('网络错误')
          break
        case 503:
          Message('服务不可用')
          break
        case 504:
          Message('网络超时')
          break
        case 505:
          Message('http版本不支持该请求')
          break
        default:
          Message(`连接错误${error.response.status}`)
      }
    } else {
      if (error.config.loading !== false) {
        hideLoading()
      }
      Message.error('连接到服务器失败')
    }
    return Promise.resolve(error.response)
  })

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get (url, params, optios) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    }).then(res => {
      resolve(res.data)
    }).catch(err => {
      reject(err.data)
    })
  })
}

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function post (url, params, optios) {
  return new Promise((resolve, reject) => {
    axios.post(url, params, optios)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}

/**
 *
 * @desc 接口统一管理
 * 另外一个文件管理 index.js
 *  main.js  全局引入使用
 * import api from './api'
 * Vue.prototype.$api = api
 * 组件内使用
 * this.$api.login(params).then(res => {})
 *
 */

const api = {
  login (params) {
    return post('api/manager/login', params)
  },
  getList (params) {
    return get('api/manager/vm/patient/list', params, { loading: false })
  }

}

export default api
